package cn.xiaobai.http;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author yangdaji
 * @Date 2023/11/29
 * @PackageName cn.xiaobai.http
 * @ClassName Request
 */
public class Request {

    /**
     * 输入流
     */
    private InputStream inputStream;

    /**
     * 请求类型
     */
    private String method;

    /**
     * url
     */
    private String uri;

    private Map<String, Object> parameterMapping = new HashMap<>();

    public Request(InputStream inputStream) {
        this.inputStream = inputStream;
        parseRequest();
    }

    /**
     * 解析请求
     */
    protected void parseRequest() {

        // 通过输入流解析其中的数据
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));

            // 读取第一行 , 请求方式, 协议, 路径 :  GET / HTTP/1.1
            String requestLine = bufferedReader.readLine();
            String[] requestLineArr = requestLine.split(" ");

            // 请求方式
            method = requestLineArr[0];

            // 请求路径, 以及参数
            String url = requestLineArr[1];
            int index = url.indexOf("?");
            // 检查是否包含参数
            if (index == -1) {
                uri = url;
            } else {
                // 获取路径
                uri = url.substring(0, index);

                // 处理参数
                url = requestLineArr[1].substring(index + 1);
                // 根据 & 分割
                String[] parametersPair = url.split("&");
                if (parametersPair != null && parametersPair.length > 0) {
                    for (String param : parametersPair) {
                        // 根据 = 分割
                        String[] parameterValue = param.split("=");
                        if (parameterValue.length == 2) {
                            parameterMapping.put(parameterValue[0], parameterValue[1]);
                        }
                    }
                }
            }

            // 协议, 这里暂时不需要

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    public String getMethod() {
        return method;
    }

    public String getUri() {
        return uri;
    }

    public Map<String, Object> getParameterMapping() {
        return parameterMapping;
    }

    public Object getParameterMapping(String name) {
        return parameterMapping.getOrDefault(name, null);
    }
}
